package loan.calc.dto.request;

import io.swagger.v3.oas.annotations.media.Schema;
import loan.calc.constant.dict.rate.*;
import loan.calc.dto.valid.group.Apply;
import loan.calc.dto.valid.group.Trial;
import lombok.Data;
import lombok.experimental.Accessors;

import javax.validation.constraints.NotNull;
import java.io.Serializable;
import java.math.BigDecimal;

/**
 * 利率信息dto
 *
 */
@Data
@Accessors(chain = true)
@Schema(description = "利率请求数据")
public class RateRequestDTO implements Serializable {

    /**
     * 基准利率
     */
    @NotNull(groups = Apply.class)
    @Schema(description = "基准利率")
    private BigDecimal baseRate;

    /**
     * 基准利率类型：贷款利率、LPR利率
     */
    @NotNull(groups = Apply.class)
    @Schema(description = "基准利率类型：贷款利率、LPR利率")
    private RateBaseTypeEnum rateBaseType;

    /**
     * 利率种类：普通贷款利率、本金罚息利率、利息罚息利率
     */
    @NotNull(groups = Apply.class)
    @Schema(description = "利率种类：普通贷款利率、本金罚息利率、利息罚息利率")
    private RateTypeEnum rateType;

    /**
     * 利率浮动种类: 固定利率、浮动利率
     */
    @NotNull(groups = Apply.class)
    @Schema(description = "利率浮动模式: 固定利率、浮动利率")
    private RateFloatModeDictEnum rateFloatMode;

    /**
     * 利率浮动类型：按比例浮动、按浮动点浮动
     */
    @Schema(description = "利率浮动类型：按比例浮动、按浮动点浮动")
    private RateFloatTypeEnum rateFloatType;

    /**
     * 利率浮动值
     * rateFloatMode为浮动时，不能为空
     */
    @Schema(description = "利率浮动值，rateFloatMode为浮动时，不能为空")
    private BigDecimal rateFloat;

    /**
     * 利率的单位
     * 年利率
     * 月利率
     * 日利率
     */
    @NotNull(groups = {Trial.class, Apply.class})
    @Schema(description = "利率的单位,年利率,月利率,日利率")
    private RateUnitEnum rateUnit;

    /**
     * 贷款执行利率
     * 须保证
     * 执行利率 == 基准利率+点数
     * 或
     * 执行利率 == 基准利率*(1+浮动比例)
     */
    @NotNull(groups = {Trial.class, Apply.class})
    @Schema(description = "贷款执行利率,须保证执行利率=基准利率+点数或执行利率=基准利率*(1+浮动比例)")
    private BigDecimal executionRate;

    /**
     * 利率调整方式：
     * 不调整,固定不变
     * 当日调整，次日生效
     * 当月末调整，次月初生效
     * 当季末调整，次季初生效
     * 当年末调整，次年初生效
     */
    @Schema(description = "利率调整方式")
    @NotNull(groups = Apply.class)
    private RateUpdateTypeEnum rateUpdateType;


    /**
     * 年基准天数:360,365,366
     * 若选择360则每个月按照30天计算
     * 若选择365则每个月按照实际天数计算，二月为28天
     * 若选择366则每个月按照实际天数计算，二月为29天
     */
    @NotNull(groups = Apply.class)
    @Schema(description = "年基准天数",example = "360")
    private Integer yearBaseDay;
    /**
     * 罚息利率上浮比例
     */
    @NotNull(groups = Apply.class)
    @Schema(description = "罚息利率上浮比例")
    private BigDecimal penaltyRateIncreaseRatio;
}
